package pe.com.hermes.hermetic.web.controller.consultas;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import java.net.URI;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.PedidoService;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.HMF3012Form;
import pe.com.hermes.hermetic.web.forms.HMF3016Form;

@SessionAttributes(value={"form","mostrarGrilla","codOpci"})
@RequestMapping("/mostrarHWF3016.html")
@Controller
public class ConsultaPedidosAgrupadosController implements IController {
    
    private Logger logger = Logger.getLogger(this.getClass());
    
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @Autowired
    private TablService tablService;    
    @Autowired
    private PedidoService pedidoService;
    
    @RequestMapping(method=RequestMethod.GET)
    protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {
        
        HMF3016Form form=new HMF3016Form();
        form.setFechaInic(servicioHermetic.getFechaHoy());
        form.setFechaDest(servicioHermetic.getFechaHoy());
        String codCliente=(String)request.getSession(false).getAttribute("cliente");
        String nomCliente=(String)request.getSession(false).getAttribute("nombreCliente");
        model.put("nombreCliente",nomCliente);
        model.put(FORM_KEY,form);
        model.put("mostrarGrilla",false);
        String codOpci = IWebOpciones.CONSUL_ARCH_PEDI_AGRU;
        String desOpci = servicioHermetic.getDesOpci(codOpci, request);
        model.put("codOpci",codOpci);
        model.put("desOpci",desOpci);
        AuditBean auditBean = new AuditBean(CONSUL_ARCH_PEDI_AGRU);
        servicioHermetic.inseAudit(auditBean);
        return FORM_CONS_ARCH_AGRU;
    }
    
    
    @RequestMapping(params={"accion=mostrar","fechaInic","fechaDest"})
    private String mostrar (@RequestParam("fechaInic") String fechaInic,@RequestParam("fechaDest") String fechaDest,
                            ModelMap model,@ModelAttribute(FORM_KEY) HMF3016Form form, HttpServletRequest request) throws Exception {    
      
        List listaArchivos=new ArrayList();
        String mensajeError="";
        String cliente=(String)request.getSession(false).getAttribute("cliente");
        int codClie=Integer.valueOf(cliente).intValue();
        try{         
            listaArchivos=pedidoService.consArchPediClie(codClie,fechaInic,fechaDest,0);
            
        }catch(Exception ex){
            //ex.printStackTrace();
            logger.error("Error al mostrar lista de Archivos de Pedidos Agrupados",ex);
            model.put("mensajeError",mensajeError);
            model.put(FORM_KEY,form);
            return FORM_CONS_ARCH_AGRU;
        }
        model.put(FORM_KEY,form);
        model.put("listaArchivos",listaArchivos);
        model.put("mostrarGrilla",true);
        return FORM_CONS_ARCH_AGRU;
    }
    
    @RequestMapping(params={"accion=anularArchPedi","codArchPedi","fechaInic","fechaDest"})
    protected String anularArchPedi(@RequestParam("codArchPedi")String codArchPediString,
                                    @RequestParam("fechaInic")String fechaInic,
                                    @RequestParam("fechaDest")String fechaDest,
                                    ModelMap model,@ModelAttribute(FORM_KEY) HMF3016Form form, HttpServletRequest request) throws Exception{
        
        
        logger.info(this.getClass().toString()+" "+"metodo: anularArchPedi");
        List listaArchivos = new ArrayList();
        String cliente=(String)request.getSession(false).getAttribute("cliente");
        int codClie=Integer.valueOf(cliente).intValue();
        //Invocar al servicio que elimina el archivo
        String usuario=(String)request.getSession(false).getAttribute("usuario");
        int codArchPedi=codArchPediString==null?0:Integer.valueOf(codArchPediString).intValue();
        int error=pedidoService.updtArchPediClie(codArchPedi,3,"SRVOAS3",usuario);
        //Invocar de nuevo a la busqueda
        if (error>0){
            logger.error("Error al anular un archivo de Pedidos Agrupados");
            model.put("mensajeError","Error al anular el archivo");
            model.put(FORM_KEY,form);
            return FORM_CONS_ARCH_AGRU;
        }

         listaArchivos=pedidoService.consArchPediClie(codClie,fechaInic,fechaDest,0); 
         model.put(FORM_KEY,form);
         model.put("listaArchivos",listaArchivos);
         return FORM_CONS_ARCH_AGRU; 
               
    }
    
    
    @RequestMapping(params={"accion=descargarArchivo"})
    protected void descargarArchivo(ModelMap model,@ModelAttribute(FORM_KEY) HMF3016Form form, HttpServletRequest request, HttpServletResponse response) throws Exception{
        
        String ruta=form.getRutaDescarga();
        if (ruta.indexOf(" ")!=-1){
            ruta=ruta.replaceAll(" ","%20");
        }
        String nombre=form.getNombreDescarga();
        String extension=ruta.substring(ruta.indexOf("."),ruta.length());
        String fileName=nombre+extension;
        try{
            
              
            File archivo=new File(new URI(ruta));
            InputStream isr = new FileInputStream (archivo);
            ServletOutputStream servletOutputStream = response.getOutputStream();    
            
            response.addHeader("Content-type", "application/octet-stream");
            response.addHeader("Content-Disposition", "attachment;filename="+fileName);
            response.setContentType("Content-type: application/octet-stream");
            
            response.setHeader("Cache-Control","cache"); // HTTP 1.1
            response.setHeader("Pragma","cache"); // HTTP 1.0
            response.setDateHeader ("Expires", -1);          
            
            long length = archivo.length();
            byte[] bytes = new byte[(int)length];
            
            // Read in the bytes
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length && (numRead=isr.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
            
            isr.close();
            servletOutputStream.write(bytes);
            servletOutputStream.flush();
            servletOutputStream.close();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
               
    }
    
}
